/*
 * @Autor: taobo
 * @Date: 2020-06-14 16:40:54
 * @LastEditTime: 2020-06-14 16:43:50
 * @Description: 给你一个链表，每 k 个节点一组进行翻转，请你返回翻转后的链表。
 */ 
//k 是一个正整数，它的值小于或等于链表的长度。
//如果节点总数不是 k 的整数倍，那么请将最后剩余的节点保持原有顺序。
// Definition for singly-linked list.

#include <iostream>
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* dummy = new ListNode(-1);
        dummy->next = head;
        ListNode *pre=dummy , *tmp=head;
        int len=0;
        while(tmp){
            ++len;
            tmp = tmp->next;
        }
        len = len/k;
        while(len--){   //核心代码仅下面10 lines
            for(int i=1;head->next && i<k;++i){
                tmp = head->next;
                head->next = tmp->next;
                tmp->next = pre->next;
                pre->next = tmp;
            }
            pre = head;
            head = head->next;
        }
        head = dummy->next;
        delete dummy;
        return head;
    }
};